﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data;

using QLTTAN.BLL;
using QLTTAN.DTO;
namespace QLTTAN.Form
{
    public partial class frmTrinhDo : DevExpress.XtraEditors.XtraForm
    {
        TrinhDoBLL TD_BLL;
        TrinhDoTienQuyetBLL TDTQ_BLL;

        int MaTrinhDoSelected = -1;

        bool isInsert = false;

        DataTable dtTrinhDoTienQuyet;
        DataTable dtTrinhDoTienQuyetTemp;

        List<int> lstMaTrinhDoTienQuyetInsert;
        List<int> lstMaTrinhDoTienQuyetDelete;

        public frmTrinhDo()
        {
            InitializeComponent();
        }

        private void FillDataInLookUpEditTrinhDoTienQuyet()
        {
            try
            {
                lookUpEditTrinhDoTienQuyet.Properties.DataSource = TD_BLL.TrinhDo_Load();
                lookUpEditTrinhDoTienQuyet.Properties.ValueMember = "MaTrinhDo";
                lookUpEditTrinhDoTienQuyet.Properties.DisplayMember = "TenTrinhDo";
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }   
        }

        private void SetEnableGroupThongTinTrinhDo(bool isEnable)
        {
            txtTenTrinhDo.Enabled = isEnable;
            lookUpEditTrinhDoTienQuyet.Enabled = isEnable;
            Xoa.OptionsColumn.AllowEdit = isEnable;

            btnLuu.Enabled = isEnable;
            btnHuy.Enabled = isEnable;
        }

        private void CreateDataTableTrinhDoTienQuyet()
        {
            dtTrinhDoTienQuyet = new DataTable();
            dtTrinhDoTienQuyet.Columns.Add("MaTrinhDoTienQuyet", typeof(int));
            dtTrinhDoTienQuyet.Columns.Add("TenTrinhDo", typeof(string));
        }

        private void CreateDataTableTrinhDoTienQuyetTemp(DataTable dt)
        {

            dtTrinhDoTienQuyetTemp = new DataTable();
            dtTrinhDoTienQuyetTemp.Columns.Add("MaTrinhDoTienQuyet", typeof(int));
            dtTrinhDoTienQuyetTemp.Columns.Add("TenTrinhDo", typeof(string));

            dtTrinhDoTienQuyetTemp = dt.Copy();
        }

        private void frmTrinhDo_Load(object sender, EventArgs e)
        {
            TD_BLL = new TrinhDoBLL();
            TDTQ_BLL = new TrinhDoTienQuyetBLL();

            FillDataInLookUpEditTrinhDoTienQuyet();

            CreateDataTableTrinhDoTienQuyet();

            try
            {
                gridCtrlTrinhDo.DataSource = TD_BLL.TrinhDo_Load();
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            SetEnableGroupThongTinTrinhDo(false);
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            string error = "";

            if (txtTenTrinhDo.Text.Trim().Equals(""))
            {
                error += "Bạn chưa nhập tên trình độ. \r\n";
            }

            if (!error.Equals(""))
            {
                XtraMessageBox.Show(error, "Thông báo!!!", MessageBoxButtons.OK);
                return;
            }

            TrinhDoDTO TD_DTO = new TrinhDoDTO();
            TD_DTO.TenTrinhDo = txtTenTrinhDo.Text.Trim();

            try
            {
                if (isInsert)
                {
                    if (TD_BLL.TrinhDo_Insert(TD_DTO) > 0)
                    {
                        DataRow row = TD_BLL.TrinhDo_GetLastID();

                        TrinhDoTienQuyetDTO TDTQ_DTO = new TrinhDoTienQuyetDTO();

                        if(row != null)
                        {
                            TDTQ_DTO.MaTrinhDo = int.Parse(row[0].ToString());
                        }

                        for (int i = 0; i < gridViewTrinhDoTienQuyet.RowCount; i++)
                        {
                            DataRow r = gridViewTrinhDoTienQuyet.GetDataRow(i);

                            if (r != null)
                            {
                                TDTQ_DTO.MaTrinhDoTienQuyet = int.Parse(r["MaTrinhDoTienQuyet"].ToString());

                                TDTQ_BLL.TrinhDoTienQuyet_Insert(TDTQ_DTO);
                            }
                        }

                        XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }   
                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    TD_DTO.MaTrinhDo = MaTrinhDoSelected;

                    if (TD_BLL.TrinhDo_Update(TD_DTO) > 0)
                    {
                        

                        TrinhDoTienQuyetDTO TDTQ_DTO = new TrinhDoTienQuyetDTO();
                        TDTQ_DTO.MaTrinhDo = MaTrinhDoSelected;

                        foreach (int item in lstMaTrinhDoTienQuyetInsert)
                        {
                            TDTQ_DTO.MaTrinhDoTienQuyet = item;

                            TDTQ_BLL.TrinhDoTienQuyet_Insert(TDTQ_DTO);
                        }

                        foreach (int item in lstMaTrinhDoTienQuyetDelete)
                        {
                            TDTQ_DTO.MaTrinhDoTienQuyet = item;

                            TDTQ_BLL.TrinhDoTienQuyet_Delete(TDTQ_DTO);
                        }
                        
                        XtraMessageBox.Show("Lưu dữ liệu thành công.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                        XtraMessageBox.Show("Lưu dữ liệu thất bại.", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            frmTrinhDo_Load(sender, e);
        }

        private void btnHuy_Click(object sender, EventArgs e)
        {
            if (XtraMessageBox.Show("Bạn có chắc chắn thoát khỏi thao tác này?", "Thông báo!!!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                frmTrinhDo_Load(sender, e);
            }
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            SetEnableGroupThongTinTrinhDo(true);

            txtTenTrinhDo.Text = string.Empty;
            lookUpEditTrinhDoTienQuyet.ItemIndex = -1;
            gridCtrlTrinhDoTienQuyet.DataSource = null;

            isInsert = true;

            CreateDataTableTrinhDoTienQuyet();
        }

        private void btnSua_Click(object sender, EventArgs e)
        {
            if (MaTrinhDoSelected == -1)
            {
                XtraMessageBox.Show("Bạn chưa chọn trình độ muốn sửa. \r\n", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            SetEnableGroupThongTinTrinhDo(true);

            isInsert = false;

            lstMaTrinhDoTienQuyetInsert = new List<int>();
            lstMaTrinhDoTienQuyetDelete = new List<int>();
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (MaTrinhDoSelected == -1)
            {
                XtraMessageBox.Show("Bạn chưa chọn trình độ muốn xóa. \r\n", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {

                if (XtraMessageBox.Show("Bạn có chắc chắn muốn xóa?", "Thông báo!!!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    TrinhDoTienQuyetDTO TDTQ_DTO = new TrinhDoTienQuyetDTO();
                    TDTQ_DTO.MaTrinhDo = MaTrinhDoSelected;

                    for (int i = 0; i < gridViewTrinhDoTienQuyet.RowCount; i++)
                    {
                        DataRow row = gridViewTrinhDoTienQuyet.GetDataRow(i);

                        if(row != null)
                        {
                            TDTQ_DTO.MaTrinhDoTienQuyet = int.Parse(row["MaTrinhDoTienQuyet"].ToString());

                            TDTQ_BLL.TrinhDoTienQuyet_Delete(TDTQ_DTO);
                        }
                    }

                    TrinhDoDTO TD_DTO = new TrinhDoDTO();
                    TD_DTO.MaTrinhDo = MaTrinhDoSelected;

                    if (TD_BLL.TrinhDo_Delete(TD_DTO) > 0)
                        XtraMessageBox.Show("Xóa dữ liệu thành công", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    else
                        XtraMessageBox.Show("Xóa dữ liệu thất bại", "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    frmTrinhDo_Load(sender, e);
                }
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void lookUpEditTrinhDoTienQuyet_EditValueChanged(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.LookUpEdit editor = (sender as DevExpress.XtraEditors.LookUpEdit);
            DataRowView row = editor.Properties.GetDataSourceRowByKeyValue(editor.EditValue) as DataRowView;
            if (row != null)
            {


                foreach (DataRow r in dtTrinhDoTienQuyet.Rows)
                {
                    if (r["MaTrinhDoTienQuyet"].ToString() == row["MaTrinhDo"].ToString())
                        return;
                }

                dtTrinhDoTienQuyet.Rows.Add(row["MaTrinhDo"], row["TenTrinhDo"]);

                gridCtrlTrinhDoTienQuyet.DataSource = dtTrinhDoTienQuyet;

                if(!isInsert)
                {
                    int MaTrinhDoTienQuyetInsert = int.Parse(row["MaTrinhDo"].ToString());

                    if (lstMaTrinhDoTienQuyetDelete.Contains(MaTrinhDoTienQuyetInsert))
                        lstMaTrinhDoTienQuyetDelete.Remove(MaTrinhDoTienQuyetInsert);

                    foreach (DataRow r in dtTrinhDoTienQuyetTemp.Rows)
                    {
                        if (r["MaTrinhDoTienQuyet"].ToString() == row["MaTrinhDo"].ToString())
                            return;
                    }

                    if (!lstMaTrinhDoTienQuyetInsert.Contains(MaTrinhDoTienQuyetInsert))
                        lstMaTrinhDoTienQuyetInsert.Add(MaTrinhDoTienQuyetInsert);

                   
                }
            }
        }

        private void repositoryItemButtonEditXoa_Click(object sender, EventArgs e)
        {
            if (!isInsert)
            {
                int MaTrinhDoTienQuyetDelete = int.Parse(gridViewTrinhDoTienQuyet.GetDataRow(gridViewTrinhDoTienQuyet.FocusedRowHandle)["MaTrinhDoTienQuyet"].ToString());

                if (!lstMaTrinhDoTienQuyetDelete.Contains(MaTrinhDoTienQuyetDelete))
                    lstMaTrinhDoTienQuyetDelete.Add(MaTrinhDoTienQuyetDelete);

                if (lstMaTrinhDoTienQuyetInsert.Contains(MaTrinhDoTienQuyetDelete))
                    lstMaTrinhDoTienQuyetInsert.Remove(MaTrinhDoTienQuyetDelete);
            }

            dtTrinhDoTienQuyet.Rows.Remove(gridViewTrinhDoTienQuyet.GetDataRow(gridViewTrinhDoTienQuyet.FocusedRowHandle));

            gridCtrlTrinhDoTienQuyet.DataSource = dtTrinhDoTienQuyet;

            
        }

        private void gridViewTrinhDo_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            if (gridViewTrinhDo.FocusedRowHandle >= 0)
            {
                SetEnableGroupThongTinTrinhDo(false);

                DataRow row = gridViewTrinhDo.GetDataRow(gridViewTrinhDo.FocusedRowHandle);

                if (row != null)
                {

                    MaTrinhDoSelected = int.Parse(row["MaTrinhDo"].ToString());
                    txtTenTrinhDo.Text = row["TenTrinhDo"].ToString();

                    TrinhDoTienQuyetDTO TDTQ_DTO = new TrinhDoTienQuyetDTO();
                    TDTQ_DTO.MaTrinhDo = MaTrinhDoSelected;

                    try
                    {
                        dtTrinhDoTienQuyet = TDTQ_BLL.TrinhDoTienQuyet_Load(TDTQ_DTO);
                        gridCtrlTrinhDoTienQuyet.DataSource = dtTrinhDoTienQuyet;
                        CreateDataTableTrinhDoTienQuyetTemp(dtTrinhDoTienQuyet);
                    }
                    catch (Exception ex)
                    {
                        XtraMessageBox.Show(ex.Message, "Thông báo!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
            }
            else
            {
                MaTrinhDoSelected = -1;
            }
        }

        private void gridViewTrinhDo_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "STT")
                e.DisplayText = (e.ListSourceRowIndex + 1).ToString();
        }

        private void gridViewTrinhDoTienQuyet_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (e.Column.FieldName == "STT")
                e.DisplayText = (e.ListSourceRowIndex + 1).ToString();
        }
    }
}